Autogenerated HTML docs for v1.8.1-rc2-5-g252f9
diff --git a/technical/pack-protocol.html b/technical/pack-protocol.html index a980cc4..aabb2c3 100644 --- a/technical/pack-protocol.html +++ b/technical/pack-protocol.html
@@ -2,15 +2,25 @@ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> -<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 8.5.2" /> +<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> +<meta name="generator" content="AsciiDoc 8.6.8" /> <title>Packfile transfer protocols</title> <style type="text/css"> -/* Debug borders */ -p, li, dt, dd, div, pre, h1, h2, h3, h4, h5, h6 { -/* - border: 1px solid red; -*/ +/* Shared CSS for AsciiDoc xhtml11 and html5 backends */ + +/* Default font. */ +body { + font-family: Georgia,serif; +} + +/* Title font. */ +h1, h2, h3, h4, h5, h6, +div.title, caption.title, +thead, p.table.header, +#toctitle, +#author, #revnumber, #revdate, #revremark, +#footer { + font-family: Arial,Helvetica,sans-serif; } body { @@ -35,13 +45,8 @@ color: #083194; } -tt { - color: navy; -} - h1, h2, h3, h4, h5, h6 { color: #527bbd; - font-family: sans-serif; margin-top: 1.2em; margin-bottom: 0.5em; line-height: 1.3; @@ -59,9 +64,11 @@ h3 + * { clear: left; } +h5 { + font-size: 1.0em; +} div.sectionbody { - font-family: serif; margin-left: 0; } @@ -77,45 +84,48 @@ ul, ol, li > p { margin-top: 0; } +ul > li { color: #aaa; } +ul > li > * { color: black; } -pre { +.monospaced, code, pre { + font-family: "Courier New", Courier, monospace; + font-size: inherit; + color: navy; padding: 0; margin: 0; } -span#author { + +#author { color: #527bbd; - font-family: sans-serif; font-weight: bold; font-size: 1.1em; } -span#email { +#email { } -span#revnumber, span#revdate, span#revremark { - font-family: sans-serif; +#revnumber, #revdate, #revremark { } -div#footer { - font-family: sans-serif; +#footer { font-size: small; border-top: 2px solid silver; padding-top: 0.5em; margin-top: 4.0em; } -div#footer-text { +#footer-text { float: left; padding-bottom: 0.5em; } -div#footer-badges { +#footer-badges { float: right; padding-bottom: 0.5em; } -div#preamble { +#preamble { margin-top: 1.5em; margin-bottom: 1.5em; } -div.tableblock, div.imageblock, div.exampleblock, div.verseblock, +div.imageblock, div.exampleblock, div.verseblock, div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock, div.admonitionblock { margin-top: 1.0em; @@ -135,7 +145,6 @@ /* Block element titles. */ div.title, caption.title { color: #527bbd; - font-family: sans-serif; font-weight: bold; text-align: left; margin-top: 1.0em; @@ -157,13 +166,15 @@ div.sidebarblock > div.content { background: #ffffee; - border: 1px solid silver; + border: 1px solid #dddddd; + border-left: 4px solid #f0f0f0; padding: 0.5em; } div.listingblock > div.content { - border: 1px solid silver; - background: #f4f4f4; + border: 1px solid #dddddd; + border-left: 5px solid #f0f0f0; + background: #f8f8f8; padding: 0.5em; } @@ -171,8 +182,8 @@ padding-left: 1.0em; margin-left: 1.0em; margin-right: 10%; - border-left: 5px solid #dddddd; - color: #777777; + border-left: 5px solid #f0f0f0; + color: #888; } div.quoteblock > div.attribution { @@ -180,8 +191,9 @@ text-align: right; } -div.verseblock > div.content { - white-space: pre; +div.verseblock > pre.content { + font-family: inherit; + font-size: inherit; } div.verseblock > div.attribution { padding-top: 0.75em; @@ -254,35 +266,12 @@ margin-bottom: 0.1em; } -div.tableblock > table { - border: 3px solid #527bbd; -} -thead, p.table.header { - font-family: sans-serif; - font-weight: bold; -} tfoot { font-weight: bold; } td > div.verse { white-space: pre; } -p.table { - margin-top: 0; -} -/* Because the table frame attribute is overriden by CSS in most browsers. */ -div.tableblock > table[frame="void"] { - border-style: none; -} -div.tableblock > table[frame="hsides"] { - border-left-style: none; - border-right-style: none; -} -div.tableblock > table[frame="vsides"] { - border-top-style: none; - border-bottom-style: none; -} - div.hdlist { margin-top: 0.8em; @@ -339,25 +328,32 @@ min-width: 100px; } - -@media print { - div#footer-badges { display: none; } +div.colist td { + padding-right: 0.5em; + padding-bottom: 0.3em; + vertical-align: top; +} +div.colist td img { + margin-top: 0.3em; } -div#toc { +@media print { + #footer-badges { display: none; } +} + +#toc { margin-bottom: 2.5em; } -div#toctitle { +#toctitle { color: #527bbd; - font-family: sans-serif; font-size: 1.1em; font-weight: bold; margin-top: 1.0em; margin-bottom: 0.1em; } -div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 { +div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 { margin-top: 0; margin-bottom: 0; } @@ -373,51 +369,173 @@ margin-left: 6em; font-size: 0.9em; } -/* Workarounds for IE6's broken and incomplete CSS2. */ -div.sidebar-content { - background: #ffffee; - border: 1px solid silver; - padding: 0.5em; +span.aqua { color: aqua; } +span.black { color: black; } +span.blue { color: blue; } +span.fuchsia { color: fuchsia; } +span.gray { color: gray; } +span.green { color: green; } +span.lime { color: lime; } +span.maroon { color: maroon; } +span.navy { color: navy; } +span.olive { color: olive; } +span.purple { color: purple; } +span.red { color: red; } +span.silver { color: silver; } +span.teal { color: teal; } +span.white { color: white; } +span.yellow { color: yellow; } + +span.aqua-background { background: aqua; } +span.black-background { background: black; } +span.blue-background { background: blue; } +span.fuchsia-background { background: fuchsia; } +span.gray-background { background: gray; } +span.green-background { background: green; } +span.lime-background { background: lime; } +span.maroon-background { background: maroon; } +span.navy-background { background: navy; } +span.olive-background { background: olive; } +span.purple-background { background: purple; } +span.red-background { background: red; } +span.silver-background { background: silver; } +span.teal-background { background: teal; } +span.white-background { background: white; } +span.yellow-background { background: yellow; } + +span.big { font-size: 2em; } +span.small { font-size: 0.6em; } + +span.underline { text-decoration: underline; } +span.overline { text-decoration: overline; } +span.line-through { text-decoration: line-through; } + +div.unbreakable { page-break-inside: avoid; } + + +/* + * xhtml11 specific + * + * */ + +div.tableblock { + margin-top: 1.0em; + margin-bottom: 1.5em; } -div.sidebar-title, div.image-title { - color: #527bbd; - font-family: sans-serif; +div.tableblock > table { + border: 3px solid #527bbd; +} +thead, p.table.header { font-weight: bold; - margin-top: 0.0em; - margin-bottom: 0.5em; + color: #527bbd; +} +p.table { + margin-top: 0; +} +/* Because the table frame attribute is overriden by CSS in most browsers. */ +div.tableblock > table[frame="void"] { + border-style: none; +} +div.tableblock > table[frame="hsides"] { + border-left-style: none; + border-right-style: none; +} +div.tableblock > table[frame="vsides"] { + border-top-style: none; + border-bottom-style: none; } -div.listingblock div.content { - border: 1px solid silver; - background: #f4f4f4; - padding: 0.5em; + +/* + * html5 specific + * + * */ + +table.tableblock { + margin-top: 1.0em; + margin-bottom: 1.5em; +} +thead, p.tableblock.header { + font-weight: bold; + color: #527bbd; +} +p.tableblock { + margin-top: 0; +} +table.tableblock { + border-width: 3px; + border-spacing: 0px; + border-style: solid; + border-color: #527bbd; + border-collapse: collapse; +} +th.tableblock, td.tableblock { + border-width: 1px; + padding: 4px; + border-style: solid; + border-color: #527bbd; } -div.quoteblock-attribution { - padding-top: 0.5em; +table.tableblock.frame-topbot { + border-left-style: hidden; + border-right-style: hidden; +} +table.tableblock.frame-sides { + border-top-style: hidden; + border-bottom-style: hidden; +} +table.tableblock.frame-none { + border-style: hidden; +} + +th.tableblock.halign-left, td.tableblock.halign-left { + text-align: left; +} +th.tableblock.halign-center, td.tableblock.halign-center { + text-align: center; +} +th.tableblock.halign-right, td.tableblock.halign-right { text-align: right; } -div.verseblock-content { - white-space: pre; +th.tableblock.valign-top, td.tableblock.valign-top { + vertical-align: top; } -div.verseblock-attribution { - padding-top: 0.75em; - text-align: left; +th.tableblock.valign-middle, td.tableblock.valign-middle { + vertical-align: middle; +} +th.tableblock.valign-bottom, td.tableblock.valign-bottom { + vertical-align: bottom; } -div.exampleblock-content { - border-left: 3px solid #dddddd; - padding-left: 0.5em; + +/* + * manpage specific + * + * */ + +body.manpage h1 { + padding-top: 0.5em; + padding-bottom: 0.5em; + border-top: 2px solid silver; + border-bottom: 2px solid silver; +} +body.manpage h2 { + border-style: none; +} +body.manpage div.sectionbody { + margin-left: 3em; } -/* IE6 sets dynamically generated links as visited. */ -div#toc a:visited { color: blue; } +@media print { + body.manpage div#toc { display: none; } +} + + </style> <script type="text/javascript"> /*<+'])'); + var re = new RegExp('[hH]([1-'+(toclevels+1)+'])'); // Function that scans the DOM tree for header elements (the DOM2 // nodeIterator API would be a better technique but not supported by all // browsers). @@ -479,6 +597,25 @@ } var toc = document.getElementById("toc"); + if (!toc) { + return; + } + + // Delete existing TOC entries in case we're reloading the TOC. + var tocEntriesToRemove = []; + var i; + for (i = 0; i < toc.childNodes.length; i++) { + var entry = toc.childNodes[i]; + if (entry.nodeName.toLowerCase() == 'div' + && entry.getAttribute("class") + && entry.getAttribute("class").match(/^toclevel/)) + tocEntriesToRemove.push(entry); + } + for (i = 0; i < tocEntriesToRemove.length; i++) { + toc.removeChild(tocEntriesToRemove[i]); + } + + // Rebuild TOC entries. var entries = tocEntries(document.getElementById("content"), toclevels); for (var i = 0; i < entries.length; ++i) { var entry = entries[i]; @@ -506,24 +643,44 @@ */ footnotes: function () { - var cont = document.getElementById("content"); + // Delete existing footnote entries in case we're reloading the footnodes. + var i; var noteholder = document.getElementById("footnotes"); + if (!noteholder) { + return; + } + var entriesToRemove = []; + for (i = 0; i < noteholder.childNodes.length; i++) { + var entry = noteholder.childNodes[i]; + if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote") + entriesToRemove.push(entry); + } + for (i = 0; i < entriesToRemove.length; i++) { + noteholder.removeChild(entriesToRemove[i]); + } + + // Rebuild footnote entries. + var cont = document.getElementById("content"); var spans = cont.getElementsByTagName("span"); var refs = {}; var n = 0; for (i=0; i<spans.length; i++) { if (spans[i].className == "footnote") { n++; - // Use [\s\S] in place of . so multi-line matches work. - // Because JavaScript has no s (dotall) regex flag. - note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1]; + var note = spans[i].getAttribute("data-note"); + if (!note) { + // Use [\s\S] in place of . so multi-line matches work. + // Because JavaScript has no s (dotall) regex flag. + note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1]; + spans[i].innerHTML = + "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n + + "' title='View footnote' class='footnote'>" + n + "</a>]"; + spans[i].setAttribute("data-note", note); + } noteholder.innerHTML += "<div class='footnote' id='_footnote_" + n + "'>" + "<a href='#_footnoteref_" + n + "' title='Return to text'>" + n + "</a>. " + note + "</div>"; - spans[i].innerHTML = - "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n + - "' title='View footnote' class='footnote'>" + n + "</a>]"; var id =spans[i].getAttribute("id"); if (id != null) refs["#"+id] = n; } @@ -543,13 +700,36 @@ } } } +}, + +install: function(toclevels) { + var timerId; + + function reinstall() { + asciidoc.footnotes(); + if (toclevels) { + asciidoc.toc(toclevels); + } + } + + function reinstallAndRemoveTimer() { + clearInterval(timerId); + reinstall(); + } + + timerId = setInterval(reinstall, 500); + if (document.addEventListener) + document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false); + else + window.onload = reinstallAndRemoveTimer; } } +asciidoc.install(); /*]]>*/ </script> </head> -<body> +<body class="article"> <div id="header"> <h1>Packfile transfer protocols</h1> </div> @@ -569,6 +749,7 @@ of data to send in order to fully update one or the other.</p></div> </div> </div> +<div class="sect1"> <h2 id="_transports">Transports</h2> <div class="sectionbody"> <div class="paragraph"><p>There are three transports over which the packfile protocol is @@ -584,6 +765,8 @@ <div class="paragraph"><p>The file:// transport runs the <em>upload-pack</em> or <em>receive-pack</em> process locally and communicates with it over a pipe.</p></div> </div> +</div> +<div class="sect1"> <h2 id="_git_transport">Git Transport</h2> <div class="sectionbody"> <div class="paragraph"><p>The Git transport starts off by sending the command and repository @@ -591,15 +774,18 @@ hostname parameter, terminated by a NUL byte.</p></div> <div class="literalblock"> <div class="content"> -<pre><tt>0032git-upload-pack /project.git\0host=myserver.com\0</tt></pre> +<pre><code>0032git-upload-pack /project.git\0host=myserver.com\0</code></pre> </div></div> +<div class="openblock"> +<div class="content"> <div class="literalblock"> <div class="content"> -<pre><tt>git-proto-request = request-command SP pathname NUL [ host-parameter NUL ] +<pre><code>git-proto-request = request-command SP pathname NUL [ host-parameter NUL ] request-command = "git-upload-pack" / "git-receive-pack" / "git-upload-archive" ; case sensitive pathname = *( %x01-ff ) ; exclude NUL -host-parameter = "host=" hostname [ ":" port ]</tt></pre> +host-parameter = "host=" hostname [ ":" port ]</code></pre> +</div></div> </div></div> <div class="paragraph"><p>Only host-parameter is allowed in the git-proto-request. Clients MUST NOT attempt to send additional parameters. It is used for the @@ -609,17 +795,19 @@ process on the server side over the Git protocol is this:</p></div> <div class="literalblock"> <div class="content"> -<pre><tt>$ echo -e -n \ +<pre><code>$ echo -e -n \ "0039git-upload-pack /schacon/gitbook.git\0host=example.com\0" | - nc -v example.com 9418</tt></pre> + nc -v example.com 9418</code></pre> </div></div> <div class="paragraph"><p>If the server refuses the request for some reasons, it could abort gracefully with an error message.</p></div> <div class="listingblock"> <div class="content"> -<pre><tt> error-line = PKT-LINE("ERR" SP explanation-text)</tt></pre> +<pre><code> error-line = PKT-LINE("ERR" SP explanation-text)</code></pre> </div></div> </div> +</div> +<div class="sect1"> <h2 id="_ssh_transport">SSH Transport</h2> <div class="sectionbody"> <div class="paragraph"><p>Initiating the upload-pack or receive-pack processes over SSH is @@ -627,7 +815,7 @@ It is basically equivalent to running this:</p></div> <div class="literalblock"> <div class="content"> -<pre><tt>$ ssh git.example.com "git-upload-pack '/project.git'"</tt></pre> +<pre><code>$ ssh git.example.com "git-upload-pack '/project.git'"</code></pre> </div></div> <div class="paragraph"><p>For a server to support Git pushing and pulling for a given user over SSH, that user needs to be able to execute one or both of those @@ -640,28 +828,28 @@ an absolute path in the remote filesystem.</p></div> <div class="literalblock"> <div class="content"> -<pre><tt> git clone ssh://user@example.com/project.git +<pre><code> git clone ssh://user@example.com/project.git | v -ssh user@example.com "git-upload-pack '/project.git'"</tt></pre> +ssh user@example.com "git-upload-pack '/project.git'"</code></pre> </div></div> <div class="paragraph"><p>In a "user@host:path" format URI, its relative to the user’s home directory, because the Git client will run:</p></div> <div class="literalblock"> <div class="content"> -<pre><tt> git clone user@example.com:project.git +<pre><code> git clone user@example.com:project.git | v -ssh user@example.com "git-upload-pack 'project.git'"</tt></pre> +ssh user@example.com "git-upload-pack 'project.git'"</code></pre> </div></div> <div class="paragraph"><p>The exception is if a <em>~</em> is used, in which case we execute it without the leading <em>/</em>.</p></div> <div class="literalblock"> <div class="content"> -<pre><tt> ssh://user@example.com/~alice/project.git, +<pre><code> ssh://user@example.com/~alice/project.git, | v -ssh user@example.com "git-upload-pack '~alice/project.git'"</tt></pre> +ssh user@example.com "git-upload-pack '~alice/project.git'"</code></pre> </div></div> <div class="paragraph"><p>A few things to remember here:</p></div> <div class="ulist"><ul> @@ -678,6 +866,8 @@ </li> </ul></div> </div> +</div> +<div class="sect1"> <h2 id="_fetching_data_from_a_server">Fetching Data From a Server</h2> <div class="sectionbody"> <div class="paragraph"><p>When one Git repository wants to get data that a second repository @@ -685,6 +875,8 @@ what data the server has that the client does not then streams that data down to the client in packfile format.</p></div> </div> +</div> +<div class="sect1"> <h2 id="_reference_discovery">Reference Discovery</h2> <div class="sectionbody"> <div class="paragraph"><p>When the client initially connects the server will immediately respond @@ -692,7 +884,7 @@ with the object name that each reference currently points to.</p></div> <div class="literalblock"> <div class="content"> -<pre><tt>$ echo -e -n "0039git-upload-pack /schacon/gitbook.git\0host=example.com\0" | +<pre><code>$ echo -e -n "0039git-upload-pack /schacon/gitbook.git\0host=example.com\0" | nc -v example.com 9418 00887217a7c7e582c46cec22a130adf4b9d7d950fba0 HEAD\0multi_ack thin-pack side-band side-band-64k ofs-delta shallow no-progress include-tag @@ -701,7 +893,7 @@ 003cb88d2441cac0977faf98efc80305012112238d9d refs/tags/v0.9 003c525128480b96c89e6418b1e40909bf6c5b2d580f refs/tags/v1.0 003fe92df48743b7bc7d26bcaabfddde0a1e20cae47c refs/tags/v1.0^{} -0000</tt></pre> +0000</code></pre> </div></div> <div class="paragraph"><p>Server SHOULD terminate each non-flush line using LF ("\n") terminator; client MUST NOT complain if there is no terminator.</p></div> @@ -717,7 +909,7 @@ MUST peel the ref if it’s an annotated tag.</p></div> <div class="listingblock"> <div class="content"> -<pre><tt> advertised-refs = (no-refs / list-of-refs) +<pre><code> advertised-refs = (no-refs / list-of-refs) flush-pkt no-refs = PKT-LINE(zero-id SP "capabilities^{}" @@ -733,13 +925,15 @@ capability-list = capability *(SP capability) capability = 1*(LC_ALPHA / DIGIT / "-" / "_") - LC_ALPHA = %x61-7A</tt></pre> + LC_ALPHA = %x61-7A</code></pre> </div></div> <div class="paragraph"><p>Server and client MUST use lowercase for obj-id, both MUST treat obj-id as case-insensitive.</p></div> <div class="paragraph"><p>See protocol-capabilities.txt for a list of allowed server capabilities and descriptions.</p></div> </div> +</div> +<div class="sect1"> <h2 id="_packfile_negotiation">Packfile Negotiation</h2> <div class="sectionbody"> <div class="paragraph"><p>After reference and capabilities discovery, the client can decide to @@ -755,7 +949,7 @@ out of what the server said it could do with the first <em>want</em> line.</p></div> <div class="listingblock"> <div class="content"> -<pre><tt> upload-request = want-list +<pre><code> upload-request = want-list *shallow-line *1depth-request flush-pkt @@ -770,7 +964,7 @@ first-want = PKT-LINE("want" SP obj-id SP capability-list LF) additional-want = PKT-LINE("want" SP obj-id LF) - depth = 1*DIGIT</tt></pre> + depth = 1*DIGIT</code></pre> </div></div> <div class="paragraph"><p>Clients MUST send all the obj-ids it wants from the reference discovery phase as <em>want</em> lines. Clients MUST send at least one @@ -799,13 +993,13 @@ a positive depth, this step is skipped.</p></div> <div class="listingblock"> <div class="content"> -<pre><tt> shallow-update = *shallow-line +<pre><code> shallow-update = *shallow-line *unshallow-line flush-pkt shallow-line = PKT-LINE("shallow" SP obj-id) - unshallow-line = PKT-LINE("unshallow" SP obj-id)</tt></pre> + unshallow-line = PKT-LINE("unshallow" SP obj-id)</code></pre> </div></div> <div class="paragraph"><p>If the client has requested a positive depth, the server will compute the set of commits which are no deeper than the desired depth. The set @@ -824,12 +1018,12 @@ so that there is always a block of 32 "in-flight on the wire" at a time.</p></div> <div class="listingblock"> <div class="content"> -<pre><tt> upload-haves = have-list +<pre><code> upload-haves = have-list compute-end have-list = *have-line have-line = PKT-LINE("have" SP obj-id LF) - compute-end = flush-pkt / PKT-LINE("done")</tt></pre> + compute-end = flush-pkt / PKT-LINE("done")</code></pre> </div></div> <div class="paragraph"><p>If the server reads <em>have</em> lines, it then will respond by ACKing any of the obj-ids the client said it had that the server also has. The @@ -906,16 +1100,16 @@ <div class="paragraph"><p>Then the server will start sending its packfile data.</p></div> <div class="listingblock"> <div class="content"> -<pre><tt> server-response = *ack_multi ack / nak +<pre><code> server-response = *ack_multi ack / nak ack_multi = PKT-LINE("ACK" SP obj-id ack_status LF) ack_status = "continue" / "common" / "ready" ack = PKT-LINE("ACK SP obj-id LF) - nak = PKT-LINE("NAK" LF)</tt></pre> + nak = PKT-LINE("NAK" LF)</code></pre> </div></div> <div class="paragraph"><p>A simple clone may look like this (with no <em>have</em> lines):</p></div> <div class="listingblock"> <div class="content"> -<pre><tt> C: 0054want 74730d410fcb6603ace96f1dc55ea6196122532d multi_ack \ +<pre><code> C: 0054want 74730d410fcb6603ace96f1dc55ea6196122532d multi_ack \ side-band-64k ofs-delta\n C: 0032want 7d1665144a3a975c05f1f43902ddaf084e784dbe\n C: 0032want 5a3f6be755bbb7deae50065988cbfa1ffa9ab68a\n @@ -925,12 +1119,12 @@ C: 0009done\n S: 0008NAK\n - S: [PACKFILE]</tt></pre> + S: [PACKFILE]</code></pre> </div></div> <div class="paragraph"><p>An incremental update (fetch) response might look like this:</p></div> <div class="listingblock"> <div class="content"> -<pre><tt> C: 0054want 74730d410fcb6603ace96f1dc55ea6196122532d multi_ack \ +<pre><code> C: 0054want 74730d410fcb6603ace96f1dc55ea6196122532d multi_ack \ side-band-64k ofs-delta\n C: 0032want 7d1665144a3a975c05f1f43902ddaf084e784dbe\n C: 0032want 5a3f6be755bbb7deae50065988cbfa1ffa9ab68a\n @@ -947,9 +1141,11 @@ C: 0009done\n S: 0031ACK 74730d410fcb6603ace96f1dc55ea6196122532d\n - S: [PACKFILE]</tt></pre> + S: [PACKFILE]</code></pre> </div></div> </div> +</div> +<div class="sect1"> <h2 id="_packfile_data">Packfile Data</h2> <div class="sectionbody"> <div class="paragraph"><p>Now that the client and server have finished negotiation about what @@ -972,6 +1168,8 @@ <div class="paragraph"><p>If no <em>side-band</em> capability was specified, the server will stream the entire packfile without multiplexing.</p></div> </div> +</div> +<div class="sect1"> <h2 id="_pushing_data_to_a_server">Pushing Data To a Server</h2> <div class="sectionbody"> <div class="paragraph"><p>Pushing data to a server will invoke the <em>receive-pack</em> process on the @@ -980,6 +1178,8 @@ references to be complete. Once all the data is received and validated, the server will then update its references to what the client specified.</p></div> </div> +</div> +<div class="sect1"> <h2 id="_authentication">Authentication</h2> <div class="sectionbody"> <div class="paragraph"><p>The protocol itself contains no authentication mechanisms. That is to be @@ -988,6 +1188,8 @@ repositories will be writable by anyone who can access that port (9418) as that transport is unauthenticated.</p></div> </div> +</div> +<div class="sect1"> <h2 id="_reference_discovery_2">Reference Discovery</h2> <div class="sectionbody"> <div class="paragraph"><p>The reference discovery phase is done nearly the same way as it is in the @@ -996,6 +1198,8 @@ real difference is that the capability listing is different - the only possible values are <em>report-status</em>, <em>delete-refs</em> and <em>ofs-delta</em>.</p></div> </div> +</div> +<div class="sect1"> <h2 id="_reference_update_request_and_packfile_transfer">Reference Update Request and Packfile Transfer</h2> <div class="sectionbody"> <div class="paragraph"><p>Once the client knows what references the server is at, it can send a @@ -1008,7 +1212,7 @@ references.</p></div> <div class="listingblock"> <div class="content"> -<pre><tt> update-request = command-list [pack-file] +<pre><code> update-request = command-list [pack-file] command-list = PKT-LINE(command NUL capability-list LF) *PKT-LINE(command LF) @@ -1022,7 +1226,7 @@ old-id = obj-id new-id = obj-id - pack-file = "PACK" 28*(OCTET)</tt></pre> + pack-file = "PACK" 28*(OCTET)</code></pre> </div></div> <div class="paragraph"><p>If the receiving end does not support delete-refs, the sending end MUST NOT ask for delete command.</p></div> @@ -1038,6 +1242,8 @@ it will run any update hooks to make sure that the update is acceptable. If all of that is fine, the server will then update the references.</p></div> </div> +</div> +<div class="sect1"> <h2 id="_report_status">Report Status</h2> <div class="sectionbody"> <div class="paragraph"><p>After receiving the pack data from the sender, the receiver sends a @@ -1049,7 +1255,7 @@ update was successful, or <em>ng [refname] [error]</em> if the update was not.</p></div> <div class="listingblock"> <div class="content"> -<pre><tt> report-status = unpack-status +<pre><code> report-status = unpack-status 1*(command-status) flush-pkt @@ -1060,7 +1266,7 @@ command-ok = PKT-LINE("ok" SP refname LF) command-fail = PKT-LINE("ng" SP refname SP error-msg LF) - error-msg = 1*(OCTECT) ; where not "ok"</tt></pre> + error-msg = 1*(OCTECT) ; where not "ok"</code></pre> </div></div> <div class="paragraph"><p>Updates can be unsuccessful for a number of reasons. The reference can have changed since the reference discovery phase was originally sent, meaning @@ -1071,7 +1277,7 @@ <div class="paragraph"><p>An example client/server communication might look like this:</p></div> <div class="listingblock"> <div class="content"> -<pre><tt> S: 007c74730d410fcb6603ace96f1dc55ea6196122532d refs/heads/local\0report-status delete-refs ofs-delta\n +<pre><code> S: 007c74730d410fcb6603ace96f1dc55ea6196122532d refs/heads/local\0report-status delete-refs ofs-delta\n S: 003e7d1665144a3a975c05f1f43902ddaf084e784dbe refs/heads/debug\n S: 003f74730d410fcb6603ace96f1dc55ea6196122532d refs/heads/master\n S: 003f74730d410fcb6603ace96f1dc55ea6196122532d refs/heads/team\n @@ -1084,14 +1290,15 @@ S: 000eunpack ok\n S: 0018ok refs/heads/debug\n - S: 002ang refs/heads/master non-fast-forward\n</tt></pre> + S: 002ang refs/heads/master non-fast-forward\n</code></pre> </div></div> </div> </div> +</div> <div id="footnotes"><hr /></div> <div id="footer"> <div id="footer-text"> -Last updated 2012-11-20 13:06:02 PDT +Last updated 2012-11-20 13:06:02 PST </div> </div> </body>